// 引入配置
import store from '@/store'
// uni-app 运行平台，与条件编译平台相同
const { uniPlatform, hostName } = uni.getSystemInfoSync()

//--------------- App:APP 或者 H5:['Web','H5']----------------------------
// #ifdef  APP-PLUS || H5
const clientType = uniPlatform.toLocaleUpperCase()
// #endif
// -----------------------微信：分企业信息和微信------------------------------------------
// #ifdef MP-WEIXIN
const clientType = hostName === 'wxwork' ? 'WXWORK' : 'WEIXIN'
// #endif
// -----------------------小程序：支付宝和钉钉------------------------------------------
// #ifdef MP-ALIPAY
const clientType = hostName === 'DINGTALK' ? 'DINGTALK' : 'ALIPAY'
// #endif
// ------------------------快应用通用(包含联盟、华为)-------------------------
// #ifdef QUICKAPP-WEBVIEW
const clientType = 'QUICKAPP'
// #endif
// ------------百度小程序、字节跳动小程序、飞书小程序、QQ小程序、快手小程序、京东小程序、360小程序-----------------------------------------
// #ifdef MP-BAIDU || MP-TOUTIAO ||MP-LARK||MP-QQ||MP-KUAISHOU||MP-JD||MP-360
// 所有小程序，去除 mp-字符，转为大写
const clientType = uniPlatform.replace("mp-", "").toLocaleUpperCase()
// #endif

console.log(`环境变量:${process.env.NODE_ENV}`, `运行平台:${clientType}`)

const baseUrl = process.env.NODE_ENV === 'development' ?
	'http://127.0.0.1:7001' :
	'https://api.yilekj.cn/xinao/'

/**
 * @example  配置API请求的全局配置\请求拦截\响应拦截
 * @param {Object} vm 此vm参数为页面的实例，可以通过它引用vuex中的变量
 * @returns {Promise} 无
 * */
module.exports = (vm) => {
	/**
	 * @example  初始化请求配置
	 * @param {Object} config 此为默认全局配置
	 * @returns {Object} 全局配置
	 * */
	uni.$u.http.setConfig((config) => {
		Object.assign(config, {
			// 根域名
			baseURL: baseUrl,
			// 响应超时
			timeout: 60000,
			// 设置自定义头部,每次请求都不变的 content-type
			header: {
				// 客户端类型 【浏览器=pc , 手机浏览器=H5 APP=APP,微信小程序=WEIXIN,支付宝小程序=ALIPAY】
				'X-client-type': clientType,
				'X-user-type': 'consumer'
			}
		})
		return config
	})
	/**
	 * @example  请求拦截
	 * @param {Object} config 此为默认全局配置
	 * @returns {Object} 全局配置
	 * */
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
		config.data = config.data || {}
		return config
	}, config => { // 可使用async await 做异步操作
		return Promise.reject(config)
	})

	/**
	 * @example  响应拦截
	 * @param {Object} response 服务器返回的数据
	 * @returns {Promise} 
	 * */
	uni.$u.http.interceptors.response.use((response) => {
		// console.log('响应拦截', response)
		const { code, message, data, token } = response.data
		// 如果返回 token,则为快到期了，须要刷新
		if (token) {
			store.dispatch('user/refreshToken', token)
		}
		// 判断可能变成了res.statueCode，或者res.data.code之类的，请打印查看结果
		if (code === 20000) {
			console.log('正确request:', data)
			return data;
		}
		console.error('响应正确res:', response) // for debug
		if ([50008, 50012, 50014,43300, 433, '43300', '433',423, '423',424,'424'].includes(code)) {
			// 50008: 公司服务到期; 50012: Other clients logged in; 50014: Token expired Token过期;
			// 你已被登出，可以取消继续留在该页面，或者重新登录
			uni.redirectTo({
				url: '/pages/index'
			});
			return Promise.reject(message)
		}
		//  校验错误
		uni.showModal({
			title: '提示信息',
			content: typeof(message) === 'string' ?
				message : typeof(message) === 'object' ? JSON.stringify(message) : '错误',
			showCancel: false,
			confirmText: '朕知了',
		}).then(res => {
			// 当42200为参数校验错误
			return Promise.reject(message)
		})
		return Promise.reject(message)
	}, (response) => {
		// 对响应错误做点什么 （statusCode !== 200）
		return Promise.reject(response)
	})
}